1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #include <cstdio> #include <algorithm> #include <cstring> const int maxn = 5005; using namespace std; int f[maxn][maxn], n, a[maxn], Max1[maxn * 100], Max2[7]; int _abs(int x){return x < 0 ? -x : x;} int main(){ scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", a + i); for (int i = 0; i <= n; i++){ memset(Max1, 0, sizeof Max1); memset(Max2, 0, sizeof Max2); for (int j = 1; j < i; j++) Max1[a[j]] = max(Max1[a[j]], f[i][j]), Max2[a[j] % 7] = max(Max2[a[j] % 7], f[i][j]); for (int j = i + 1; j <= n; j++){ f[i][j] = max(f[i][j], max(Max1[a[j] - 1], Max1[a[j] + 1]) + 1); f[i][j] = max(f[i][j], f[i][0] + 1); f[i][j] = max(f[i][j], Max2[a[j] % 7] + 1); Max1[a[j]] = max(Max1[a[j]], f[i][j]); Max2[a[j] % 7] = max(Max2[a[j] % 7], f[i][j]); f[j][i] = f[i][j]; } } int ans = 0; for (int i = 0; i <= n; i++) for (int j = i + 1; j <= n; j++) ans = max(ans, f[i][j]); printf("%d\n", ans); return 0; }
|